package com.Sep_Twenty_Nine;

import java.util.ArrayList;
import java.util.List;

/**
 * 89. 格雷编码
 * n 位格雷码序列 是一个由 2n 个整数组成的序列，其中：
 * 每个整数都在范围 [0, 2n - 1] 内（含 0 和 2n - 1）
 * 第一个整数是 0
 * 一个整数在序列中出现 不超过一次
 * 每对 相邻 整数的二进制表示 恰好一位不同 ，且
 * 第一个 和 最后一个 整数的二进制表示 恰好一位不同
 * 给你一个整数 n ，返回任一有效的 n 位格雷码序列 。
 *
 *  
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/gray-code
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * 2022/09/29 10:19
 */

public class Solution89 {

    /**
     * 直接推导
     * @param n
     * @return
     */
    public List<Integer> grayCode(int n) {
        /**
         * 最重要的是要搞清楚格雷码的生成：G(i) = i ^ (i/2);
         * G(0) = 000,
         * G(1) = 1 ^ 0 = 001 ^ 000 = 001
         * G(2) = 2 ^ 1 = 010 ^ 001 = 011
         * G(3) = 3 ^ 1 = 011 ^ 001 = 010
         * G(4) = 4 ^ 2 = 100 ^ 010 = 110
         * G(5) = 5 ^ 2 = 101 ^ 010 = 111
         * G(6) = 6 ^ 3 = 110 ^ 011 = 101
         * G(7) = 7 ^ 3 = 111 ^ 011 = 100
         */
        List<Integer> res=new ArrayList<>();
        for (int i=0;i<1<<n;i++)
        {
            res.add(i^i>>1);
        }
        return res;
    }

    public static void main(String[] args) {
        Solution89 solution89=new Solution89();
        System.out.println(solution89.grayCode(2));
    }


}
